package com.sys.app.entity.tag;

import com.alibaba.druid.util.StringUtils;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.templatemode.TemplateMode;

/**
 * 按钮控件
 */
public class easyUIButton extends AbstractElementTagProcessor {
    // 标签名
    private static final String TAG_NAME = "button";

    // 优先级
    private static final int PRECEDENCE = 10004;


    /*
   templateMode: 模板模式，这里使用HTML模板。
   dialectPrefix: 标签前缀。即xxx:text中的xxx。
   elementName：匹配标签元素名。举例来说如果是div，则我们的自定义标签只能用在div标签中。为null能够匹配所有的标签。
   prefixElementName: 标签名是否要求前缀。
   attributeName: 自定义标签属性名。这里为text。
   prefixAttributeName：属性名是否要求前缀，如果为true，Thymeeleaf会要求使用text属性时必须加上前缀，即xxx:text。
   precedence：标签处理的优先级，此处使用和Thymeleaf标准方言相同的优先级。
   removeAttribute：标签处理后是否移除自定义属性。
   */
    public easyUIButton(String dialectPrefix) {
        super(
                // 模板类型为HTML
                TemplateMode.HTML,
                // 标签方言前缀
                dialectPrefix,
                // 标签名称
                TAG_NAME,
                // 将标签前缀应用于标签名称
                true,
                // 无属性名称：将通过标签名称匹配
                null,
                // 没有要应用于属性名称的前缀
                false,
                // 优先级
                PRECEDENCE
        );
    }
    /**
     * 处理自定义标签 DOM 结构
     *
     * @param iTemplateContext            模板页上下文
     * @param iProcessableElementTag      待处理标签
     * @param iElementTagStructureHandler 元素标签结构处理器
     */
    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
        // 获取 Spring 上下文
        // ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        // 获取注入bean工厂
        //AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
        // 获取所需的bean，一般情况下这里我们直接使用Jdbc来操作数据库，因为它是一个公共组件，数据源不确定，所以要使用动态sql
        //JdbcOperations jdbcOperations = autowireCapableBeanFactory.getBean(JdbcOperations.class);
        //name属性
        String name = iProcessableElementTag.getAttributeValue("name");
        //type属性
        String vtype = iProcessableElementTag.getAttributeValue("vtype");

        //显示文字
        String label = iProcessableElementTag.getAttributeValue("label");
        //图标
        String iconCls = iProcessableElementTag.getAttributeValue("iconCls");
        if (StringUtils.isEmpty(iconCls) || "".equals(iconCls)) {
            iconCls = "";
        }
        //事件
        String onclick = iProcessableElementTag.getAttributeValue("onclick");
        if (StringUtils.isEmpty(onclick) || "null".equals(onclick)) {
            onclick = "";
        }
        //为true时显示简洁效果
        String plain = iProcessableElementTag.getAttributeValue("plain");
        if (StringUtils.isEmpty(plain) || "null".equals(plain)) {
            plain = "false";
        }

        StringBuffer result = new StringBuffer();
        //增删改查保存，关闭固定图标
        result.append("<a ");
        result.append("id=\"").append(name.replace(".", "_")).append("\" ");
        result.append("name=\"").append(name).append("\" ");
        result.append("plain=\"").append(plain).append("\" ");
        result.append("href=\"").append("javascript:void(0)").append("\" ");
        result.append("class=\"").append("easyui-linkbutton but").append("\" ");
        if (!"".equals(onclick)) {
            result.append("onclick=\"").append(String.format("javascript:%s", onclick)).append("\" ");
        }
        if("".equals(iconCls)) {
            //增加
            if ("add".equals(vtype)) {
                iconCls="fa fa-plus-square";
                // result.append("data-options=\"").append(String.format("iconCls:'%s'", "icon-add1")).append("\" ");
            }
            //删除
            if ("del".equals(vtype)) {
                iconCls="fa fa-minus-square";
            }
            //编辑
            if ("edit".equals(vtype)) {
                iconCls="fa fa-pencil";
            }
            //保存
            if ("save".equals(vtype)) {
                iconCls="fa fa-save";
            }
            //关闭
            if ("close".equals(vtype)) {
                iconCls="fa fa-power-off";
            }
            //查询
            if ("search".equals(vtype)) {
                iconCls="fa fa-search";
            }
            //重置
            if ("reset".equals(vtype)) {
               iconCls="fa fa-mail-reply";
            }
            //打印
            if ("print".equals(vtype)) {
               iconCls="fa fa-print";
            }
            //刷新
            if ("reload".equals(vtype)) {
                iconCls="fa fa-refresh";
            }
            //上传
            if ("upload".equals(vtype)) {
                iconCls="fa fa-cloud-upload";
            }
            //下载
            if ("download".equals(vtype)) {
                iconCls="fa fa-cloud-download";
            }

        }
        result.append("iconAlign=\"").append("left").append("\" ");
        result.append("size=\"").append("small").append("\" ");
        result.append(">");
        //图标
        result.append("<i ");
        result.append("class=\"").append(iconCls).append("\" ");
        result.append("style=\"").append("font-size:16px; color: #0d6efd").append("\" ");
        result.append(">");
        //result.append(label);
        result.append("</i> ");
        result.append(label);
        result.append("</a>");
        //<a id="btn" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">easyui</a>
        // 创建将替换自定义标签的 DOM 结构
        IModelFactory modelFactory = iTemplateContext.getModelFactory();
        IModel model = modelFactory.createModel();
        // 这里是将字典的内容拼装成HTML
        model.add(modelFactory.createText(result));
        // 利用引擎替换整合标签
        iElementTagStructureHandler.replaceWith(model, false);
    }
}
